﻿using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

using System.Security.Cryptography;
using System.Text;
using System.Collections.Generic;
using System.IO;

namespace Tony
{
	/// <summary>
	/// CommonFunction 通用函数
	/// </summary>
	public class CommonFunction
	{
		#region 构造函数
		public CommonFunction()
		{

		}
		#endregion

		/**********************************************************************************************
		 ** 函数名：	ExceptString
		 ** 功能描述：	在一个字符串中去除尾部指定的字符串，如果尾部有的话，没有就不用去除
		 ** 输入参数：	lstrExcept		需要去除的字符串
		 **		lstrString
		 ** 输出参数：
		 ** 返回值：
		 ** 作者：	Tony Mucor
		 ** 日期：	2013-07-08
		 *********************************************************************************************/
		public static string ExceptString(string lstrExcept, string lstrString)
		{
			int lnExceptLen;
			int lnStringLen;
			string lstrReturn = "";
			string lstrTemp;

			lnExceptLen = lstrExcept.Length;		// 获得要去除字符串的长度
			lnStringLen = lstrString.Length;
			if (lnExceptLen > 0)
			{
				lstrTemp = lstrString.Substring(lnStringLen - lnExceptLen);
				if (lstrTemp == lstrExcept)
				{
					lstrReturn = lstrString.Substring(0, lnStringLen - lnExceptLen);
				}
				else
				{
					lstrReturn = lstrString;
				}
			}
			else
			{
				lstrReturn = lstrString;
			}

			return lstrReturn;
		}

		public static string OutLinkFirstChar(string lstrLink)
		{
			//return lstrLink.Substring(1, lstrLink.Length - 1);
			int i;

			i = lstrLink.LastIndexOf("/");

			return lstrLink.Substring(i + 1);
		}

		/// <summary>
		/// <para>功能描述：	把绝对路径转换成虚拟路径</para>
		/// <para>输入参数：	string imagesurl1	绝对路径</para>
		/// <para>		string strRootDir	网站根目录路径</para>
		/// <para>返回值：	</para>
		/// <para>方法范围：	protected</para>
		/// <para>作者：	Tony Mucor</para>
		/// <para>日期：	2013-08-06</para>
		/// <para>备注：	</para>
		/// </summary>
		public static string urlconvertor(string imagesurl1, string strRootDir)
		{
			//string tmpRootDir = Server.MapPath(System.Web.HttpContext.Current.Request.ApplicationPath.ToString());//获取程序根目录
			string tmpRootDir = strRootDir;
			string imagesurl2 = imagesurl1.Replace(tmpRootDir, ""); //转换成相对路径
			imagesurl2 = imagesurl2.Replace(@"\", @"/");
			return imagesurl2;
		}

		/// <summary>
		/// <para>功能描述：	在一个字符串中查找指定的字符串，找到返回true，字符串是用“， ”分割的</para>
		/// <para>输入参数：	string str1		需要查找的字符串</para>
		/// <para>		string strFind		要查找的字符串</para>
		/// <para>返回值：	</para>
		/// <para>方法范围：	protected</para>
		/// <para>作者：	Tony Mucor</para>
		/// <para>日期：	2013-08-08</para>
		/// <para>备注：	</para>
		/// </summary>
		public static Boolean FindString(string str1, string strFind)
		{
			//if (str1.IndexOf(strFind) > 0)
			//{
			//        return true;
			//}
			//else
			//{
			//        return false;
			//}
			Boolean bReturn;

			bReturn = false;
			string[] str = str1.Split(',');
			foreach (string strIn in str)
			{
				if (strIn.Trim() == strFind.Trim())
				{
					bReturn = true;
					break;
				}
			}

			return bReturn;
		}

		/// <summary>
		/// <para>功能描述：	获得有当前年月组成的字符串，类似201112</para>
		/// <para>输入参数：	</para>
		/// <para>返回值：	</para>
		/// <para>方法范围：	public</para>
		/// <para>作者：	Tony Mucor</para>
		/// <para>日期：	2013-08-09</para>
		/// <para>备注：	</para>
		/// </summary>
		public static string GetNowYearMonth()
		{
			DateTime dtNow;
			string strReturn;

			dtNow = DateTime.Now;
			strReturn = dtNow.Year.ToString() + dtNow.Month.ToString();

			return strReturn;
		}

		/// <summary>
		/// <para>功能描述：	获得一个以现在日期命名的文件夹名字，类似20111231</para>
		/// <para>输入参数：	</para>
		/// <para>返回值：	</para>
		/// <para>方法范围：	public</para>
		/// <para>作者：	Tony Mucor</para>
		/// <para>日期：	2013-08-09</para>
		/// <para>备注：	</para>
		/// </summary>
		public static string GetNowDate()
		{
			DateTime dtNow;
			string strReturn;

			dtNow = DateTime.Now;
			strReturn = dtNow.Year.ToString() + dtNow.Month.ToString() + dtNow.Day.ToString();

			return strReturn;
		}

		/// <summary>
		/// <para>功能描述：	获得当前时间的字符串，类似1549</para>
		/// <para>输入参数：	</para>
		/// <para>返回值：	</para>
		/// <para>方法范围：	private</para>
		/// <para>作者：	Tony Mucor</para>
		/// <para>日期：	2013-08-09</para>
		/// <para>备注：	</para>
		/// </summary>
		private static string GetNowTime()
		{
			DateTime dtNow;
			string strReturn;

			dtNow = DateTime.Now;
			strReturn = dtNow.Hour.ToString() + dtNow.Minute.ToString() + dtNow.Second.ToString();

			return strReturn;
		}

		/// <summary>
		/// <para>功能描述：	获得当前日期时间组成的字符串，类似201112311552</para>
		/// <para>输入参数：	</para>
		/// <para>返回值：	</para>
		/// <para>方法范围：	public</para>
		/// <para>作者：	Tony Mucor</para>
		/// <para>日期：	2013-08-09</para>
		/// <para>备注：	</para>
		/// </summary>
		public static string GetNowDateTime()
		{
			return GetNowDate() + GetNowTime();
		}

		/// <summary>
		/// <para>功能描述：	获得一个字符串的MD5编码</para>
		/// <para>输入参数：	</para>
		/// <para>返回值：	</para>
		/// <para>方法范围：	public</para>
		/// <para>作者：	Tony Mucor</para>
		/// <para>日期：	2013-08-09</para>
		/// <para>备注：	</para>
		/// </summary>
		public static string GetMd5Hash(string input)
		{
			MD5 md5Hash;

			md5Hash = MD5.Create();

			// Convert the input string to a byte array and compute the hash.
			byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input));

			// Create a new Stringbuilder to collect the bytes
			// and create a string.
			StringBuilder sBuilder = new StringBuilder();

			// Loop through each byte of the hashed data 
			// and format each one as a hexadecimal string.
			for (int i = 0; i < data.Length; i++)
			{
				sBuilder.Append(data[i].ToString("x2"));
			}

			// Return the hexadecimal string.
			return sBuilder.ToString();
		}

		/// <summary>
		/// 如果文件名中包含中文字，进行转换以免出现乱码
		/// </summary>
		/**********************************************************************************************
		 ** 功能描述：	如果文件名中包含中文字，进行转换以免出现乱码
		 ** 输入参数：
		 ** 返回值：
		 ** 作者：	Tony Mucor
		 ** 日期：	2013-08-15
		 ** 修改：
		 ** 日期：
		 *********************************************************************************************/
		public static string UTF_FileName(string strFilename)
		{

			return HttpUtility.UrlEncode(strFilename, System.Text.Encoding.UTF8);

		}

		#region 获得指定路径下所有指定类型的文件， 如果扩展名为空，则是全部类型的文件
		/// <summary>
		/// 获得指定路径下所有指定类型的文件， 如果扩展名为空，则是全部类型的文件
		/// </summary>
		/*******************************************************************
		 * * 功    能：	获得指定路径下所有指定类型的文件， 如果扩展名为空，则是全部类型的文件
		 * * 参    数：	strPath		指定路径
		 * *		strExtension	指定的扩展名
		 * * 返 回 值：
		 * * 作    者： Tony Mucor
		 * * 创建日期： 2013-9-24 15:20:58
		 * *******************************************************************/
		public static List<string> GetFileByPathExtension(string strPath, string strExtension)
		{
			DirectoryInfo dirNow;		// 当前路径
			FileInfo[] arrFileSubFiles;		// 当前路径下的所有文件
			string strSearch;
			List<string> listFiles;

			listFiles = new List<string>();
			if (strExtension != "")
			{
				strSearch = "*." + strExtension;
			}
			else
			{
				strSearch = "*.*";
			}
			dirNow = new DirectoryInfo(strPath);
			arrFileSubFiles = dirNow.GetFiles(strSearch);

			if (arrFileSubFiles.Length > 0)
			{
				foreach(FileInfo file in arrFileSubFiles)
				{
					listFiles.Add(urlconvertor(file.FullName, strPath));
				}
			}

			GetNowDirectoryChildFiles(dirNow, ref listFiles, strSearch, strPath);

			return listFiles;
		}
		#endregion

		#region 获得当前路径下下级文件，并添加到总的List中
		/// <summary>
		/// 获得当前路径下下级文件，并添加到总的List中
		/// </summary>
		/*******************************************************************
		 * * 功    能：	获得当前路径下下级文件，并添加到总的List中
		 * * 参    数：	theDir		当前路径
		 * *		listFiles	总的文件List
		 * *		strSearch	要查找的文件过滤字符串
		 * *		strPath		要查找的文件最上层路径
		 * * 返 回 值：
		 * * 作    者： Tony Mucor
		 * * 创建日期： 2013-9-24 15:38:58
		 * *******************************************************************/
		private static void GetNowDirectoryChildFiles(DirectoryInfo theDir, ref List<string> listFiles, string strSearch, string strPath)
		{
			DirectoryInfo[] arrSubDir;		// 当前路径下所有文件夹

			arrSubDir = theDir.GetDirectories();
			if (arrSubDir.Length > 0)
			{
				foreach (DirectoryInfo subDir in arrSubDir)
				{
					FileInfo[] arrSubFiles;

					arrSubFiles = subDir.GetFiles(strSearch);
					if (arrSubFiles.Length > 0)
					{
						foreach (FileInfo file in arrSubFiles)
						{
							listFiles.Add(urlconvertor(file.FullName, strPath));
						}
					}

					GetNowDirectoryChildFiles(subDir, ref listFiles, strSearch, strPath);
				}
			}
		}
		#endregion
	}
}